home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 4838 / 4838.xpi / chrome / multipletab.jar / content / multipletab / config.js < prev    next >
Text File  |  2010-02-03  |  9KB  |  326 lines

  1. const XULAppInfo = Components.classes['@mozilla.org/xre/app-info;1']
  2.         .getService(Components.interfaces.nsIXULAppInfo);
  3. const comparator = Components.classes['@mozilla.org/xpcom/version-comparator;1']
  4.                     .getService(Components.interfaces.nsIVersionComparator);
  5.  
  6. const MENU_EDITOR_ID = '{EDA7B1D7-F793-4e03-B074-E6F303317FB0}';
  7.  
  8. var gAutoPopupItems = [];
  9. var gDelayItems = [];
  10. var gDragModeRadio;
  11.  
  12. function init()
  13. {
  14.     var ext = window['piro.sakura.ne.jp'].extensions;
  15.  
  16.     var installed = ext.isInstalled(MENU_EDITOR_ID);
  17.     var enabled = ext.isEnabled(MENU_EDITOR_ID);
  18.  
  19.     [
  20.         'menuEditorLink-selection',
  21.         'menuEditorLink-context'
  22.     ].forEach(function(aItem) {
  23.         aItem = document.getElementById(aItem);
  24.         if (installed)
  25.             aItem.setAttribute('collapsed', true);
  26.         else
  27.             aItem.removeAttribute('collapsed');
  28.     });
  29.  
  30.     [
  31.         'menuEditorConfig-selection',
  32.         'menuEditorConfig-context'
  33.     ].forEach(function(aItem) {
  34.         aItem = document.getElementById(aItem);
  35.         if (installed)
  36.             aItem.removeAttribute('collapsed');
  37.         else
  38.             aItem.setAttribute('collapsed', true);
  39.         if (enabled)
  40.             aItem.removeAttribute('disabled');
  41.         else
  42.             aItem.setAttribute('disabled', true);
  43.     });
  44.  
  45.  
  46.     [
  47.         {
  48.             ids   : ['printalltabs@peculier.com'],
  49.             items : ['extensions.multipletab.show.multipletab-selection-printTabs-check']
  50.         },
  51.         {
  52.             ids   : [
  53.                 '{dc572301-7619-498c-a57d-39143191b318}', // Tab Mix Plus
  54.                 'tabutils@ithinc.cn' // Tab Utilities
  55.             ],
  56.             items : [
  57.                 'extensions.multipletab.show.multipletab-selection-freezeTabs-check',
  58.                 'extensions.multipletab.show.multipletab-selection-protectTabs-check'
  59.             ]
  60.         },
  61.         {
  62.             ids   : [
  63.                 '{dc572301-7619-498c-a57d-39143191b318}', // Tab Mix Plus
  64.                 'tabutils@ithinc.cn', // Tab Utilities
  65.                 '{752a85d4-68d6-48ae-ab7d-6640f5f75d85}' // Super Tab Mode
  66.             ],
  67.             items : [
  68.                 'extensions.multipletab.show.multipletab-selection-lockTabs-check'
  69.             ]
  70.         }
  71.     ].forEach(function(aDefinition) {
  72.         var enabled = aDefinition.ids.some(function(aId) {
  73.                     return ext.isInstalled(aId) && ext.isEnabled(aId);
  74.                 });
  75.         aDefinition.items
  76.             .map(document.getElementById, document)
  77.             .forEach(enabled ?
  78.                 function(aItem) { aItem.removeAttribute('disabled'); } :
  79.                 function(aItem) { aItem.setAttribute('disabled', true); }
  80.             );
  81.     });
  82.  
  83.     new window['piro.sakura.ne.jp'].arrowScrollBoxScrollHelper('formatTypeBox', 'radio');
  84.     new window['piro.sakura.ne.jp'].arrowScrollBoxScrollHelper('selectionMenuItemsBox', 'checkbox');
  85.     new window['piro.sakura.ne.jp'].arrowScrollBoxScrollHelper('contextMenuItemsBox', 'checkbox');
  86.  
  87. //    sizeToContent();
  88. }
  89.  
  90. function initGeneralPane()
  91. {
  92.     gDragModeRadio = document.getElementById('extensions.multipletab.tabdrag.mode-radiogroup');
  93.  
  94.     gDelayItems.push(document.getElementById('extensions.multipletab.tabdrag.delay-textbox'));
  95.     gDelayItems.push(gDelayItems[0].previousSibling);
  96.     gDelayItems.push(gDelayItems[0].nextSibling);
  97.  
  98.     gAutoPopupItems.push(document.getElementById('extensions.multipletab.tabdrag.autopopup-check'));
  99.     gAutoPopupItems.push(document.getElementById('extensions.multipletab.tabdrag.autoclear-check'));
  100.  
  101.     onDragModeChange();
  102. }
  103.  
  104. function onDragModeChange()
  105. {
  106.     gDelayItems.forEach(function(aItem) {
  107.         if (gDragModeRadio.value == 0)
  108.             aItem.setAttribute('disabled', true);
  109.         else
  110.             aItem.removeAttribute('disabled');
  111.     });
  112.     gAutoPopupItems.forEach(function(aItem) {
  113.         if (gDragModeRadio.value == 1)
  114.             aItem.removeAttribute('disabled');
  115.         else
  116.             aItem.setAttribute('disabled', true);
  117.     });
  118. }
  119.  
  120. function openMenuEditorConfig()
  121. {
  122.     window['piro.sakura.ne.jp'].extensions.goToOptions(MENU_EDITOR_ID);
  123. }
  124.  
  125.  
  126.  
  127. const kROW_ID_PREFIX = 'format-';
  128.  
  129. var gFormatsPref;
  130. var gFormatsBox;
  131. var gFormatsRadio;
  132. var gFormatTemplate;
  133. var gAddFormatButton;
  134. var gUndoRemoveFormatButton;
  135. var gFormatsUndoCache = [];
  136.  
  137. function initClipboardPane()
  138. {
  139.     gFormatsPref     = document.getElementById('extensions.multipletab.clipboard.formats');
  140.     gFormatsBox      = document.getElementById('formats-box');
  141.     gFormatsRadio    = document.getElementById('extensions.multipletab.clipboard.formatType-radiogroup');
  142.     gFormatTemplate  = document.getElementById('format-template');
  143.     gAddFormatButton = document.getElementById('formats-add');
  144.     gUndoRemoveFormatButton = document.getElementById('formats-undo');
  145.  
  146.     initCustomFormats();
  147.     gFormatsRadio.value = document.getElementById('extensions.multipletab.clipboard.formatType').value;
  148. }
  149.  
  150. function getRowById(aID)
  151. {
  152.     return document.getElementById(kROW_ID_PREFIX+aID);
  153. }
  154. function getRadioFromRow(aRow)
  155. {
  156.     return aRow.getElementsByTagName('radio')[0];
  157. }
  158. function getLabelFieldFromRow(aRow)
  159. {
  160.     return aRow.getElementsByTagName('textbox')[0];
  161. }
  162. function getFormatFieldFromRow(aRow)
  163. {
  164.     return aRow.getElementsByTagName('textbox')[1];
  165. }
  166.  
  167. function removeFormat(aRow)
  168. {
  169.     var id           = getRadioFromRow(aRow).getAttribute('value');
  170.     var selected     = parseInt(gFormatsRadio.value);
  171.     var selectedItem = gFormatsRadio.selectedItem;
  172.  
  173.     var cache = {
  174.             id     : id,
  175.             label  : getLabelFieldFromRow(aRow).value,
  176.             format : getFormatFieldFromRow(aRow).value
  177.         };
  178.     if (cache.label || cache.format) {
  179.         gFormatsUndoCache.push(cache);
  180.         gUndoRemoveFormatButton.removeAttribute('disabled');
  181.     }
  182.  
  183.     var nextRow = aRow.nextSibling;
  184.     while (nextRow)
  185.     {
  186.         let radio = getRadioFromRow(nextRow);
  187.         let id = radio.getAttribute('value');
  188.         id = parseInt(id)-1;
  189.         radio.setAttribute('value', id);
  190.         nextRow.setAttribute('id', kROW_ID_PREFIX+id);
  191.         nextRow = nextRow.nextSibling;
  192.     }
  193.     gFormatsBox.removeChild(aRow);
  194.  
  195.     if (selected == id) {
  196.         gFormatsRadio.value = -1;
  197.         cache.selected = true;
  198.     }
  199.     else if (selected >= 1000) {
  200.         gFormatsRadio.selectedItem = selectedItem;
  201.     }
  202.  
  203.     updateCustomFormats();
  204. }
  205.  
  206. function undoRemoveFormat()
  207. {
  208.     if (!gFormatsUndoCache.length) return;
  209.  
  210.     var cache = gFormatsUndoCache.pop();
  211.     var newRow = addNewFormat(cache.label, cache.format);
  212.  
  213.     var row = getRowById(cache.id);
  214.     if (row && row != newRow) {
  215.         (function(aRow) {
  216.             let nextRow = aRow.nextSibling;
  217.             if (!nextRow) return;
  218.  
  219.             arguments.callee(nextRow);
  220.  
  221.             getLabelFieldFromRow(nextRow).value = getLabelFieldFromRow(aRow).value;
  222.             getFormatFieldFromRow(nextRow).value = getFormatFieldFromRow(aRow).value;
  223.  
  224.             if (!cache.selected) {
  225.                 let radio = getRadioFromRow(aRow);
  226.                 if (radio == gFormatsRadio.selectedItem)
  227.                     gFormatsRadio.selectedItem = getRadioFromRow(nextRow);
  228.             }
  229.         })(row);
  230.         getLabelFieldFromRow(row).value = cache.label;
  231.         getFormatFieldFromRow(row).value = cache.format;
  232.         if (cache.selected)
  233.             gFormatsRadio.selectedItem = getRadioFromRow(row);
  234.     }
  235.  
  236.     updateCustomFormats();
  237.  
  238.     if (!gFormatsUndoCache.length)
  239.         gUndoRemoveFormatButton.setAttribute('disabled', true);
  240. }
  241.  
  242. function addNewFormat(aLabel, aFormat)
  243. {
  244.     var id = parseInt(getRadioFromRow(gFormatsBox.lastChild).getAttribute('value')) + 1;
  245.  
  246.     var newRow = gFormatTemplate.cloneNode(true);
  247.     getRadioFromRow(newRow).setAttribute('value', id);
  248.     newRow.setAttribute('id', kROW_ID_PREFIX+id);
  249.  
  250.     gFormatsBox.appendChild(newRow);
  251.  
  252.     var radio = getRadioFromRow(newRow);
  253.     if (gFormatsRadio.mRadioChildren) gFormatsRadio.mRadioChildren = null; // for Firefox 2
  254.  
  255.     if (aLabel) {
  256.         getLabelFieldFromRow(newRow).value = aLabel;
  257.     }
  258.     if (aFormat) {
  259.         getFormatFieldFromRow(newRow).value = aFormat;
  260.         onFormatInput(newRow);
  261.     }
  262.  
  263.     if (!aLabel && !aFormat) {
  264.         window.setTimeout(function() {
  265.             getLabelFieldFromRow(newRow).focus();
  266.             updateCustomFormats();
  267.         }, 0);
  268.     }
  269.  
  270.     return newRow;
  271. }
  272.  
  273. function updateCustomFormats()
  274. {
  275.     var value = [];
  276.     var row = gFormatTemplate.nextSibling;
  277.     while (row)
  278.     {
  279.         value.push(
  280.             [
  281.                 getFormatFieldFromRow(row).value,
  282.                 getLabelFieldFromRow(row).value
  283.             ]
  284.             .map(encodeURIComponent)
  285.             .join('/')
  286.         );
  287.         row = row.nextSibling;
  288.     }
  289.     value = value.join('|')
  290.             .replace(/[\|\/]+$/, ''); // delete last blank rows
  291.     if (value != gFormatsPref.value)
  292.         gFormatsPref.value = value;
  293. }
  294.  
  295. function initCustomFormats()
  296. {
  297.     var range = document.createRange();
  298.     range.selectNodeContents(gFormatsBox);
  299.     range.setStartAfter(gFormatTemplate);
  300.     range.deleteContents();
  301.     range.detach();
  302.     var value = gFormatsPref.value
  303.         .replace(/[\|\/]+$/, ''); // delete last blank rows
  304.     if (!value) return;
  305.     value.split('|')
  306.         .forEach(function(aFormat) {
  307.             let format, label;
  308.             [format, label] = aFormat.split('/').map(decodeURIComponent);
  309.             addNewFormat(label, format);
  310.         });
  311. }
  312.  
  313. function onFormatInput(aRow)
  314. {
  315.     var radio = getRadioFromRow(aRow);
  316.     var format = getFormatFieldFromRow(aRow);
  317.     if (format.value) {
  318.         radio.removeAttribute('disabled');
  319.     }
  320.     else {
  321.         radio.setAttribute('disabled', true);
  322.         if (radio == gFormatsRadio.selectedItem)
  323.             gFormatsRadio.value = -1;
  324.     }
  325. }
  326.